package main

import (
	"fmt"
	"log"
	"os"
	"path/filepath"
	"sort"
	"sync"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/layout"
	"fyne.io/fyne/v2/widget"
)

type Logger struct {
	mu       sync.Mutex
	file     *os.File
	filename string
	counter  int
}

func NewLogger(filename string) (*Logger, error) {
	file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		return nil, err
	}
	return &Logger{
		file:     file,
		filename: filename,
	}, nil
}

func (l *Logger) Write(p []byte) (n int, err error) {
	l.mu.Lock()
	defer l.mu.Unlock()

	fileInfo, err := l.file.Stat()
	if err != nil {
		return 0, err
	}

	// 假设我们设置日志文件最大为1MB
	if fileInfo.Size() > 1*1024*1024 {
		if err := l.rotate(); err != nil {
			return 0, err
		}
	}

	return l.file.Write(p)
}

func (l *Logger) rotate() error {
	l.file.Close()
	newFilename := fmt.Sprintf("%s.%d", l.filename, l.counter)
	l.counter++

	// 重命名当前日志文件
	if err := os.Rename(l.filename, newFilename); err != nil {
		return err
	}

	// 打开新的日志文件
	var err error
	l.file, err = os.OpenFile(l.filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		return err
	}

	// 删除最旧的日志文件（如果数量超过限制）
	files, err := filepath.Glob(fmt.Sprintf("%s.*", filepath.Dir(l.filename)))
	if err != nil {
		return err
	}
	if len(files) > 3 { // 假设我们最多保留3个旧的日志文件
		sort.Strings(files) // 这里需要导入"sort"包
		os.Remove(files[0])
	}

	return nil
}

func (l *Logger) Close() error {
	l.mu.Lock()
	defer l.mu.Unlock()
	return l.file.Close()
}

// 日志文件切割
func (app *config) startSegmentation() func() {
	return func() {

		w := fyne.CurrentApp().NewWindow("生成二维码")

		// C:\Users\vteip\Desktop\548\access.2024-08-06.log
		input := widget.NewEntry()
		input.SetPlaceHolder("请输入文件路径")
		input.Wrapping = 2     // 开启自动换行
		input.MultiLine = true //多行输入

		startSegmentationBtn := widget.NewButton("开始分割", func() {})
		startSegmentationBtn.OnTapped = func() {
			// rl, _ := rotatelogs.New("/path/to/access_log.%Y%m%d%H%M")

			/* rl, _ := rotatelogs.New("C:/Users/vteip/Desktop/548/access.2024-08-06.log%Y%m%d%H%M")
			log.SetOutput(rl) */

			/* log.SetOutput(&lumberjack.Logger{
				Filename:   "C:/Users/vteip/Desktop/548/access.2024-08-06.log",
				MaxSize:    500, // megabytes
				MaxBackups: 3,
				MaxAge:     28,   //days
				Compress:   true, // disabled by default
			}) */

			/* log.SetOutput(&lumberjack.Logger{
				// Filename:   "./access.2024-08-06.log", // 日志文件的位置
				Filename:   "C:/Users/vteip/Desktop/548/access.2024-08-08.log",
				MaxSize:    1,    // 每个日志文件保存的最大尺寸 单位：M
				MaxBackups: 3,    // 日志文件最多保存多少个备份
				MaxAge:     28,   // 文件最多保存多少天
				Compress:   true, // 是否压缩/归档老文件
			})
			log.Println("This is a test log message.") */
			logger, err := NewLogger("C:/Users/vteip/Desktop/548/access.2024-08-08.log")
			if err != nil {
				fmt.Println("Failed to create logger: %v", err)
			}
			// defer logger.Close()

			// 使用自定义Logger
			log.SetOutput(logger)

			// 示例日志记录
			// log.Println("This is a test log message.")
			fmt.Println("This is a test log message")
		}

		emptyBtn := widget.NewButton("清空", func() {
			input.SetText("")
		})

		funcLayout := container.New(layout.NewHBoxLayout(), startSegmentationBtn, emptyBtn)
		inputLayout := container.New(layout.NewVBoxLayout(), input, funcLayout)
		allLayout := container.NewBorder(inputLayout, nil, nil, nil, nil)
		w.SetContent(allLayout)

		w.SetFixedSize(true) // 设置固定大小，避免用户拖动改变大小

		// start 监听主窗口的关闭事件
		// 前提是必须设置主窗口
		w.SetOnClosed(func() {
			w.Close()
		})
		// end 监听主窗口的关闭事件

		// 设置窗口大小,
		w.Resize(fyne.NewSize(450, 260))
		w.CenterOnScreen()
		w.Show()
	}
}
